package ch.ebnoether.controller;

import ch.ebnoether.gui.WinnerCardLeft;
import ch.ebnoether.gui.WinnerCardRight;
import ch.ebnoether.wuerfel.Dice;

public class ControllerLogik {

  public static int paschBerechnen(Dice[] dice, int pasch) {

    int total = 0;
    if (paschSuchen(dice, pasch)) {
      total = summeWuerfel(dice);
    }
    return total;
  }

  public static boolean paschSuchen(Dice[] dice, int pasch) {
    boolean found = false;

    int[] gezaehlt = wuerfelArtZaehlen(dice);
    int[] sortiert = wuerfelArtenSortieren(gezaehlt);

    if (sortiert[0] >= pasch) {
      found = true;
    }
    return found;
  }

  public static int fullHouseBerechnen(Dice[] dice) {

    int[] gezaehlt = wuerfelArtZaehlen(dice);
    int[] sortiert = wuerfelArtenSortieren(gezaehlt);

    if (sortiert[0] == 3 && sortiert[1] == 2) {
      return 25;
    }
    return 0;
  }

  public static int kleineStrasseBerechnen(Dice[] dices) {

    if (kleineStrasseSuchen(dices, 0) || kleineStrasseSuchen(dices, 1) || kleineStrasseSuchen(dices, 2)) {
      return 30;
    }
    return 0;
  }

  public static boolean kleineStrasseSuchen(Dice[] dices, int erhoehung) {

    int[] gezaehlt = wuerfelArtZaehlen(dices);

    if (gezaehlt[0 + erhoehung] >= 1 && gezaehlt[1 + erhoehung] >= 1 && gezaehlt[2 + erhoehung] >= 1 && gezaehlt[3 + erhoehung] >= 1) {
      return true;
    }
    return false;
  }

  public static int grosseStrasseBerechnen(Dice[] dices) {

    int[] gezaehlt = wuerfelArtZaehlen(dices);
    int[] sortiert = wuerfelArtenSortieren(gezaehlt);

    if (sortiert[4] == 1 && (gezaehlt[0] == 0 || gezaehlt[5] == 0)) {
      return 40;
    }
    return 0;
  }

  public static int yatzyBerechnen(Dice[] dices) {

    int[] gezaehlt = wuerfelArtZaehlen(dices);
    int[] sortiert = wuerfelArtenSortieren(gezaehlt);

    if (sortiert[0] == 5) {
      return YatzyController.YATZYWERT;
    }
    return 0;
  }

  public static int chanceBerechnen(Dice[] dices) {
    return summeWuerfel(dices);
  }

  public static int summeWuerfel(Dice[] dice) {
    int summe = 0;
    for (int i = 0; i < 5; i++) {
      summe += dice[i].getAugenzahl();
    }
    return summe;
  }

  public static int zaehleGleicheArt(Dice[] dices, int wuerfelArt) {
    int gleiche = 0;

    for (int i = 0; i < 5; i++) {
      if (dices[i].getAugenzahl() == wuerfelArt) {
        gleiche += dices[i].getAugenzahl();
      }
    }
    return gleiche;
  }

  public static void setTotalLinks(WinnerCardLeft links, int gleiche) {
    int z = links.getTotalLeft() + gleiche;
    links.setTotalLeft(z);
    links.updatTotalLeft();
  }

  public static void setTotalRechts(WinnerCardRight rechts, int summe) {
    int z = rechts.getTotalRechts() + summe;
    rechts.setTotalRechts(z);
    rechts.setGesamtTotal(z + WinnerCardLeft.gesamtLinks);
    rechts.aktualisiereTotalRechts();
  }

  public static int[] wuerfelArtZaehlen(Dice[] dice) {
    int[] sortiert = new int[6];
    for (int i = 0; i < dice.length; i++) {
      Dice d1 = dice[i];
      int a = d1.getAugenzahl();
      for (int j = 0; j < sortiert.length; j++) {
        if (a == j + 1) {
          sortiert[j] += 1;
          break;
        }
      }
    }
    return sortiert;
  }

  public static int[] wuerfelArtenSortieren(int[] z) {
    int[] sortiert = new int[6];
    int count = 0;
    for (int j = 5; j > 0; j--) {
      for (int i = 0; i < sortiert.length; i++) {
        int z1 = z[i];
        if (z1 == j) {
          sortiert[count] = z1;
          count++;
        }
      }
    }
    return sortiert;
  }
}
